
///////////////////////////////////////////////////////////////////////////////
//
//  Copyright (c) 2005, Perry L Miller IV
//  All rights reserved.
//  BSD License: http://www.opensource.org/licenses/bsd-license.html
//
///////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////
//
//  XML document class.
//
///////////////////////////////////////////////////////////////////////////////

#include "XmlTree/Document.h"
#include "XmlTree/Loader.h"
#include "XmlTree/Writer.h"

using namespace XmlTree;


///////////////////////////////////////////////////////////////////////////////
//
//  Header for the document.
//
///////////////////////////////////////////////////////////////////////////////

namespace Detail { const std::string HEADER ( "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" ); }


///////////////////////////////////////////////////////////////////////////////
//
//  Constructor.
//
///////////////////////////////////////////////////////////////////////////////

Document::Document() : BaseClass ( "document" ),
  _header ( Detail::HEADER )
{
}


///////////////////////////////////////////////////////////////////////////////
//
//  Constructor.
//
///////////////////////////////////////////////////////////////////////////////

Document::Document ( const std::string &name ) : BaseClass ( name ),
  _header ( Detail::HEADER )
{
}


///////////////////////////////////////////////////////////////////////////////
//
//  Destructor
//
///////////////////////////////////////////////////////////////////////////////

Document::~Document()
{
  this->clear();
}


///////////////////////////////////////////////////////////////////////////////
//
//  Load the file.
//
///////////////////////////////////////////////////////////////////////////////

void Document::load ( const std::string &file )
{
  Loader loader;
  loader.load ( file, this );
}


///////////////////////////////////////////////////////////////////////////////
//
//  Load the file.
//
///////////////////////////////////////////////////////////////////////////////

void Document::load ( const std::istream &stream )
{
  Loader loader;
  loader.load ( stream, this );
}


///////////////////////////////////////////////////////////////////////////////
//
//  Load from a buffer.
//
///////////////////////////////////////////////////////////////////////////////

void Document::loadFromMemory ( const std::string& buffer )
{
  Loader loader;
  loader.loadFromMemory ( buffer, this );
}


///////////////////////////////////////////////////////////////////////////////
//
//  Write to file.
//
///////////////////////////////////////////////////////////////////////////////

void Document::write ( const std::string &file, bool includeHeader ) const
{
  Writer writer;
  writer.write ( this, file, includeHeader );
}


///////////////////////////////////////////////////////////////////////////////
//
//  Write to file.
//
///////////////////////////////////////////////////////////////////////////////

void Document::write ( std::ostream &out, bool includeHeader ) const
{
  Writer writer;
  writer.write ( this, out, includeHeader );
}
